<?php

class Contrato extends BaseModel {
	
	protected $contratoid;
	protected $numerosiof;
	protected $numeroorgao;
	protected $tipocontratoid;
	protected $modalidadelicitacaoid;
	protected $statusid;
	protected $numerolicitacao;
	protected $objeto;
	protected $valorglobal;
	protected $valormensal;
	protected $diasvigencia;
	protected $datainicio;
	protected $datafim;
	protected $empresaid;
	protected $orgaoid;
	protected $contratooriginalid;
	protected $ativo;
	protected $numeroaditivo;
	protected $observacao;
	
	const tablename = "contratos";
	const tablekey = "contratoid";
	const tablesequence = "contratos_contratoid_seq";
         
        
    public static function listarView($campo, $operador, $valor) {
		$sql = "select contratoid, empresa, numerosiof, numeroorgao, orgao, tipocontrato
		        from vwcontratos ";
		if (trim($valor) <> "" && $campo <> "0")
		{
		    if ($campo == 'contratoid')
		    { $sql .= "where $campo $operador $valor "; }
		    else
		    {
		        if ($operador == "ilike")
		        { $sql .= "where $campo $operador '%$valor%' "; }
		        else
		        { $sql .= "where $campo $operador '$valor' "; }
		    }
		}
		$sql .= "order by numerosiof ";
		
		return TUtils::CriarResultSet($sql); 
	}

	
    public static function alterarStatusBloco($bloco, $status) {
		$sql = "UPDATE contratos SET statusid = $status WHERE contratoid in (";
		for($i = 0; $i < count ( $bloco ); $i ++) {
			$sql .= $bloco [$i];
			if ($i < count ( $bloco ) - 1) {
				$sql .= ",";
			} else {
				$sql .= ")";
			}
		}
								
		pg_query ( conexao::Conectar (), $sql ) or die ( "Erro ao excluir." );
	}
        
        
        
	public function getOrgaoNome(){
	
		$sql = "SELECT nome from orgaos where orgaoid = " . $this->orgaoid;
		return pg_fetch_object(pg_query(conexao::Conectar(), $sql));
	
	}
	
	/**
	 * @return Empresa
	 */
	public function getEmpresa(){
		$empresa = new Empresa($this->empresaid);
		return $empresa;
	}
	
	/**
	 * @return Orgao
	 */
	public function getOrgao(){
		$orgao = new Orgao($this->orgaoid);
		return $orgao;
	}
	
	public function getTipoContrato(){
		$objeto = new TipoContrato($this->tipocontratoid);
		return $objeto;
	}
	
	public function getModalidadeLicitacao(){
		$objeto = new ModalidadeLicitacao($this->modalidadelicitacaoid);
		return $objeto;
	}
        
	public function getEmpresaNome(){
    
    	$sql = "SELECT nome from empresas where empresaid = " . $this->empresaid;
    	return pg_fetch_object(pg_query(conexao::Conectar(), $sql));
	}
	
	public function getVagas()
	{
	    if (!$this->contratoid) {
	        return NULL;
	    }
	    
	    $criterio = array();
	    $criterio['precondicao'] = 'contratoid = ' . $this->contratoid;
	    
	    $vaga = new Vaga();
	    $result = $vaga->listar($criterio);
	    
	    if (pg_num_rows($result) == 0) {
	        return NULL;
	    }
	    else {
	        return pg_fetch_all($result);
	    }
	}
	
    public function getCargos()
	{
	    if (!$this->contratoid) {
	        return NULL;
	    }
	    
	    $sql  = 'SELECT DISTINCT cargoid FROM ';
	    $sql .= Vaga::tablename . ' WHERE contratoid = ' . $this->contratoid; 
	    
	    $result = TSqlSelect::customSelect($sql);
	    
	    if (pg_num_rows($result) == 0) {
	        return NULL;
	    }
	    else {
	        $result = pg_fetch_all($result);
	        $cargos = array();
	        foreach ($result as $r) {
	            $cargos[] = $r['cargoid'];
	        }
	        return $cargos; 
	    }
	}
	
    public function getLotacoes()
	{
	    if (!$this->contratoid) {
	        return NULL;
	    }
	    
	    $criterio = array();
	    $criterio['precondicao'] = 'contratoid = ' . $this->contratoid;
	    
	    $lotacaoContrato = new LotacaoContrato();
	    $result = $lotacaoContrato->listar($criterio);
	    
	    if (pg_num_rows($result) == 0) {
	        return NULL;
	    }
	    else {
	        return $result;
	    }
	}
        
	public function criarLotacoesContrato(){
		$orgao = new Orgao($this->orgaoid);
        $result = $orgao->getLotacoes();
        $count = pg_num_rows($result);
        
        for($i=0;$i<$count;$i++){
        	$lotacao = pg_fetch_object($result);
        	$lotacaoContrato = new LotacaoContrato();
        	$lotacaoContrato->contratoid = $this->contratoid;
        	$lotacaoContrato->lotacaoid = $lotacao->lotacaoid;
        	$lotacaoContrato->salvar();
        }
	}
	
	public function criarLotacoesAditivo()
	{
	    $contrato = new Contrato($this->contratooriginalid);
	    $result = $contrato->getLotacoes();
        $count = count(pg_fetch_all($result));
        
        for ($i=0; $i<$count; $i++) {
            $lotacao = pg_fetch_object($result);
            $lotacaoContrato = new LotacaoContrato();
            $lotacaoContrato->contratoid = $this->contratoid;
            $lotacaoContrato->lotacaoid = $lotacao->lotacaoid;
            $lotacaoContrato->salvar();
        }
	}
	
	public function excluirLotacoesContrato($orgaoid){
		$sql = "DELETE FROM lotacoescontrato 
				WHERE " . $this->getTableKey() . ' = ' . $this->getTableKeyValue() . 
				" AND lotacaoid IN ( SELECT lotacaoid FROM lotacoes
				    WHERE orgaoid = ".$orgaoid.")";
		TUtils::CriarResultSet($sql);
		
	}
	
    public function salvar()
    {
		// Transformações
		$this->valormensal = TUtils::DecToNum($this->valormensal);
		$this->valorglobal = TUtils::DecToNum($this->valorglobal);
		$this->datainicio = TUtils::DataPtEn($this->datainicio);
		$this->datafim = TUtils::DataPtEn($this->datafim);
		
		// Validações
		if (strlen($this->valormensal) > 11) throw new Exception("Valor mensal inválido.");
		if (strlen($this->valorglobal) > 11) throw new Exception("Valor global inválido.");
		if (!TUtils::is_date($this->datainicio))
		  throw new Exception("Data de Início inválida.");
		if (!TUtils::is_date($this->datafim)) throw new Exception("Data Fim inválida.");
		
		// Validações
		if (!is_numeric($this->valorglobal)) {
			throw new Exception("Erro: valor global deve ser numérico");
		}
		if (!is_numeric($this->valormensal)) {
			throw new Exception("Erro: valor mensal deve ser numérico");
		}
		if ($this->datafim 
		    AND (strtotime($this->datainicio) > strtotime($this->datafim))) { 
			throw new Exception("Erro: data de início não deve ser maior que a data
			    de fim.");
		}

	    parent::salvar();
	}
    
	public function alterarJustificativasAditivo($justificativas = NULL, $openTransaction = TRUE)
	{
	    if (!$this->getTableKeyValue()) {
	        return NULL;
	    }
	    
	    try {
	        if ($openTransaction) {
			    pg_query(conexao::Conectar(), 'begin');
	        }
			
    	    $sql = 'DELETE FROM ' . JustificativaAditivo::tablename . ' WHERE ' .
    	       $this->getTableKey() . ' = ' . $this->getTableKeyValue();
    	    TSqlSelect::customSelect($sql);
    	    
    	    if ($justificativas){
    		    foreach ($justificativas as $j) {
    		        $justificativaAditivo = new JustificativaAditivo();
    		        $justificativaAditivo->contratoid = $this->getTableKeyValue();
    		        $justificativaAditivo->motivoaditivoid = $j;
    		        $justificativaAditivo->salvar();
    		    }
    		}
    		
    		if ($openTransaction) {
    		    pg_query(conexao::Conectar(), 'commit');
    		}
		} 
		catch (Exception $e){
	        if ($openTransaction) {
                pg_query(conexao::Conectar(), 'rollback');
	        }
            throw new Exception($e->getMessage());
		}
	}
	
	public function encaminharRescisao()
	{
	    try {
	        //Abrindo Transacao
			pg_query(conexao::Conectar(), "begin");
			
    	    //Alterando contrato Status
    		$this->statusid = Status::Contrato_RescisaoEncaminhada;
    		$this->salvar();

	        //Para todos os candidatos alocados em vagas ativas
	        //inserir novo status no seu historico "Contrato em Rescisao"
			$sql_historico = '	SELECT c.candidatovagaid
                                FROM candidatovaga c
                                JOIN vaga v ON c.vagaid = v.vagaid AND
                                			   v.ativa is TRUE AND
                                			   v.contratoid = ' . $this->contratoid;
			
			$result = TUtils::CriarResultSet($sql_historico);
			$total =  pg_num_rows($result);
            for ($i = 0 ; $i < $total ; $i++) {
        		$obj = pg_fetch_object($result);
        		$candHistorico = new CandidatoVagaHistorico();
        		$candHistorico->candidatovagaid = $obj->candidatovagaid;
        		$candHistorico->statusid = Status::Candidato_Contrato_Rescisao;
        		$candHistorico->dataregistro = date('Y-m-d H:i:s');
        		$candHistorico->operadorid = $_SESSION['_usuarioid'];        		
        		$candHistorico->salvar();         		
        	}     	
        	$sql_selecao = 'SELECT selecaocandidatoid 
                            FROM selecoescandidatos sc
                            JOIN selecoes s ON sc.selecaoid = s.selecaoid
                            JOIN vaga v ON s.vagaid = v.vagaid AND
                            	           v.contratoid = ' . $this->contratoid .
                            'WHERE sc.ativo IS TRUE';
        	
        	$result = TUtils::CriarResultSet($sql_selecao);
			$total =  pg_num_rows($result);
            for ($i = 0 ; $i < $total ; $i++) {
                $obj = pg_fetch_object($result);
        		$candSelHistorico = new SelecaoCandidatoHistorico();
        		$candSelHistorico->selecaocandidatoid = $obj->selecaocandidatoid;
        		$candSelHistorico->statusid = Status::Candidato_Contrato_Rescisao;
        		$candSelHistorico->dataregistro = date('Y-m-d H:i:s');
        		$candSelHistorico->operadorid = $_SESSION['_usuarioid'];        		
        		$candSelHistorico->salvar();
            }
	        
    		//Commit	
            pg_query(conexao::Conectar(), "commit");
		}catch (Exception $e){
            pg_query(conexao::Conectar(), "rollback");
            throw new Exception($e->getMessage());
		}
	}
	
	public function confirmarRescisao()
	{
		try {
			pg_query(conexao::Conectar(), "begin");
			
			//Alterando contrato Status
			$this->statusid = Status::Contrato_RescisaoConfirmada;
			$this->ativo= 'f';
			$this->salvar();
			
			//Alterar as vagas para inativa e status(A contratar)
			$sql = 'UPDATE vaga  SET ativa=FALSE, statusid='.Status::Vaga_AContratar;
			$sql.= 'WHERE contratoid='.$this->contratoid;
			TUtils::CriarResultSet($sql);
						
			//Alterar os candidatovaga para inativo
			$sql = 'UPDATE candidatovaga  SET ativo=FALSE
					WHERE vagaid in (SELECT vagaid FROM vaga WHERE contratoid=' .
			            $this->contratoid.') AND ativo IS TRUE';
			TUtils::CriarResultSet($sql);
			
			//Inserir os candidatovagahistorico 
			$sql = 'SELECT c.candidatovagaid as id 
                    FROM vaga v
                    JOIN candidatovaga c ON c.vagaid=v.vagaid  
                    WHERE v.ativa is TRUE AND v.contratoid = ' . $this->contratoid;
			
			$result = TUtils::CriarResultSet($sql);
			$total =  pg_num_rows($result);
            for ($i = 0 ; $i < $total ; $i++) {
        		$obj = pg_fetch_object($result);
        		$candHistorico = new CandidatoVagaHistorico();
        		$candHistorico->candidatovagaid = $obj->id;
        		$candHistorico->statusid = Status::Candidato_Devolvido;
        		$candHistorico->dataregistro = date('Y-m-d H:i:s');
        		$candHistorico->operadorid = $_SESSION['_usuarioid'];        		
        		$candHistorico->salvar();         		
        	}
        	//Commit	
            pg_query(conexao::Conectar(), "commit");
		}catch (Exception $e){
               pg_query(conexao::Conectar(), "rollback");
                throw new Exception($e->getMessage());
		}
		
	}
	
	public function listarCandidatosRescisao(){
	    $view  = new ViewRescisaoCandidatos();
	    return $view->listar(array('precondicao'=>'contratoid = '.$this->contratoid));	
	}
	
    public function totalSalarioBruto(){
        
        $sql = 'SELECT sum((fnmontantea(s.salarioid) + fnmontanteb(s.salarioid))::numeric(20,2)) as total
                FROM candidatovaga cv
                JOIN vaga v			ON cv.vagaid = v.vagaid AND v.ativa is true AND v.contratoid =' . $this->contratoid. '
                JOIN salario s		ON s.contratoid = v.contratoid AND s.cargoid = v.cargoid AND date(now()) >= s.iniciovigencia AND date(now()) <= s.fimvigencia
                WHERE cv.ativo is true ';
        $result = TSqlSelect::customSelect($sql);
        $data = pg_fetch_array($result);		
		$total = $data[0];
        return $total;        
		
	}

	public function hasVagasLotadas()
	{
	    if ( !$this->contratoid )
			return FALSE;
		
		$vaga = new Vaga();
		$result = $vaga->listar( array( 'precondicao' => 'lotacaoid IS NOT NULL', 'campo' => $this->getTableKey(), 'operador' => '=', 'valor' => $this->getTableKeyValue() ) );
		
		if ( pg_num_rows( $result ) == 0 )
			return FALSE;
			
		return TRUE;    
	}
	
	public function hasSalarios(){
		
		if ( !$this->contratoid )
			return FALSE;
		
		//1. Verifica se te vagas
		if (!$this->hasVagas()) {
		    return FALSE;
		}
			
		$sql = "SELECT v.vagaid 
				FROM " . 
		            Vaga::tablename . " as v
		        WHERE 
		        	v.cargoid NOT IN (
		        		SELECT s.cargoid FROM " . Salario::tablename . "  as s
		        		WHERE s.contratoid = " . $this->contratoid . " 
		        		AND s.cargoid = v.cargoid
		        		) AND 
		        		v.contratoid = " . $this->contratoid;
			
        $result = TSqlSelect::customSelect($sql);
		
		if ( pg_num_rows( $result ) > 0 )
			return FALSE;
			
		return TRUE;
	}
	
	/**
	 * Verifica se o contrato tem vagas
	 * @return unknown_type
	 */
	public function hasVagas(){
		
		if ( !$this->contratoid )
			return FALSE;
		
		$vaga = new Vaga();
		$result = $vaga->listar( array( 'campo' => $this->getTableKey(), 'operador' => '=', 'valor' => $this->getTableKeyValue() ) );
		
		if ( pg_num_rows( $result ) == 0 )
			return FALSE;
			
		return TRUE;
			
	}
	
	/**
	 * Verifica se o contrato tem vagas ocupadas
	 * @return unknown_type
	 */
	public function hasVagasOcupadas(){
		
		if ( !$this->contratoid )
			return FALSE;
		
		$v = new Vaga();
		$result = $v->listar(
		    array('campo' => 'contratoid',
		          'operador' => '=',
		          'valor' => $this->getTableKeyValue()));
		
		if ( pg_num_rows( $result ) == 0 )
			return FALSE;
			
		$vagas = pg_fetch_all($result);
		
		$ids = '';
		foreach ( $vagas as $v )
			$ids .= $v['vagaid'].',';
		$ids = substr($ids, 0, strlen($ids)-1);
			
		$cv = new CandidatoVaga();
		$result = $cv->listar( array( 'precondicao' => 'ativo IS TRUE AND vagaid IN (' . $ids . ')' ) );
		
		if ( pg_num_rows( $result ) == 0 )
			return FALSE;
			
		return TRUE;
			
	}
	
	public function hasMotivosAditivo(Array $motivos) {
		
		$sql = "SELECT motivoaditivoid FROM justificativasaditivo WHERE contratoid = ";
		$sql .= $this->contratoid . ";";
		
		$result_set = TUtils::CriarResultSet($sql);
		
		$result = pg_fetch_all($result_set);
		
		for ($i = 0; $i < count($result); $i++) {
			$resultado[$i] = $result[$i]['motivoaditivoid'];
		}
		
		foreach ($motivos as $motivo) {
			if (in_array($motivo, $resultado)) {
				return TRUE;
			}
		}
	}
	
	public function isBloqueado(){
		
		global $usuario;		
		global $pfcid;
		
		if ( !( $pfcid > 0 ) )
			return TRUE;
		
		if (
		        $this->statusid != NULL AND 
		        $this->statusid != Status::Contrato_Cadastrado AND 
				$this->statusid != Status::Contrato_CadastroFinalizado AND 
				$this->statusid != Status::Contrato_CadastroRecusado 
			){
			return TRUE;
		}
			
		return FALSE;
		
	}
	
	/**
	 * Ajusta o campo observação do contrato para adicionar a nova informação
	 * @param $parecer
	 */
    public function setParecer( $parecer )
	{
	    $usuario = $_SESSION['usuario'];
	    if ( !$usuario ){
	        throw new Exception("Usuário não encontrado. Por favor, faça login novamente no sistema.");
	    }
	    $this->observacao = date('d/m/Y h:i') . ' - ' . $usuario->usuario . ': ' . $parecer . '<br/>' . $this->observacao;
	}
	
	public function isAuthorized( $operacao )
	{
	    global $usuario, $pfcid;
		
		switch( $operacao ){
			
		    case Operacao::CONTRATO_FINALIZARCADASTRO:
				
				if ( 
						(
							$this->statusid == Status::Contrato_Cadastrado 
						) AND 
						$usuario->isAuthorized( Operacao::CONTRATO_FINALIZARCADASTRO ) 
					)
					return TRUE;
				
				break;
		    
			case Operacao::CONTRATO_ENCAMINHARPARANUCLEOCENTRAL:
				
				if ( 
						(
							$this->statusid == Status::Contrato_CadastroFinalizado OR 
							$this->statusid == Status::Contrato_CadastroRecusado 
						) AND 
						$usuario->isAuthorized( Operacao::CONTRATO_ENCAMINHARPARANUCLEOCENTRAL ) 
					)
					return TRUE;
				
				break;
				
			case Operacao::CONTRATO_APROVARREPROVAR:
				
				if ( 
						$this->statusid == Status::Contrato_EncaminhadoGabinete AND  
						$usuario->isAuthorized( Operacao::CONTRATO_APROVARREPROVAR ) 
					)
					return TRUE;
				
				break;
			
		}
		
		return FALSE;
	}
	
	/**
	 * Finaliza o cadastro do contrato
	 * @param $parecer
	 * @return unknown_type
	 */
	public function finalizarCadastro( $parecer )
	{
	    if ( $this->hasSalarios() === FALSE )
	    	throw new Exception( 'O cadastro deste contrato não pode ser finalizado, pois existem cargos sem salários.' );
	    
	    $this->statusid = Status::Contrato_CadastroFinalizado;
	    $this->setParecer( $parecer );
	    $this->salvar();
	}
	
	/**
	 * Encaminha o contrato para o núcleo central
	 * @param $parecer
	 */
	public function encaminharNucleoCentral( $parecer )
	{
	    // Pré-condições -------------------------------------------------
	    
	    if ($this->hasSalarios() === FALSE){
	        throw new Exception( 'Este contrato não pode ser encaminhado para o núcleo central, pois existem cargos que não possui nenhum salário cadastrado.' );
	    }
	    
	    if ($this->hasVagasLotadas() === FALSE){
	        throw new Exception( 'Este contrato não pode ser encaminhado para o núcleo central, pois não possui nenhuma vaga lotada.' );
	    }
	    
	    // Fim pré-condições
	    
	    $this->statusid = Status::Contrato_EncaminhadoGabinete;
	    $this->setParecer( $parecer );
	    $this->salvar();
	}
	
	/**
	 * Confirma o cadastro do contrato
	 * @param $parecer
	 */
	public function confirmarCadastro( $parecer )
	{
        $this->statusid = Status::Contrato_CadastroConfirmado;
	    $this->ativo = TRUE; //ativa o contrato
	    $this->setParecer( $parecer );
	    $this->salvar();
    }
	
	/**
	 * Recusa o cadastro do contrato
	 * @param $parecer
	 */
	public function recusarCadastro( $parecer )
	{
	    $this->statusid = Status::Contrato_CadastroRecusado;
	    $this->setParecer( $parecer );
	    $this->salvar();
	}
	
	public function desativar( $statusExclusao = TRUE, $verificarStatus = TRUE, $abrirTransacao = TRUE )
	{
	    if (!$this->getTableKeyValue()) {
	        return NULL;
	    }
	    
	    $vaga = new Vaga();
        $result = $vaga->listar(array('campo' => 'contratoid', 'operador' => '=', 'valor' => $this->getTableKeyValue()));

        $vagasContrato = pg_fetch_all($result);
        if ($vagasContrato) {
            foreach($vagasContrato as $v) {
                if ($v['statusid'] == Status::Vaga_Ocupada) {
                    throw new Exception('Não é possível excluir o contrato de número ' . $this->numeroorgao . ', pois ele possui pelo menos uma vaga ocupada.');
                }
            }
        }
        
	    try {
	        if ($abrirTransacao){
	            pg_query(conexao::Conectar(), "begin");
	        }
	        
	        //0. Verificar Status
	        if ($verificarStatus) {
	            if (
	                    $this->statusid != Status::Contrato_Cadastrado AND 
	                    $this->statusid != Status::Contrato_CadastroFinalizado AND 
	                    $this->statusid != Status::Contrato_EncaminhadoGabinete AND
	                    $this->statusid != Status::Contrato_CadastroRecusado 
	               )
	               throw new Exception('O contrato de número ' . $this->numeroorgao . ' não pode ser excluído neste momento.');
	        }
	        
	        //1. Desativar o Contrato
	        $this->ativo = FALSE;
	        if ( $statusExclusao ) {
	            $this->statusid = Status::Contrato_Excluido;
	        }
	        $this->salvar();
	        
	        if (pg_num_rows($result) > 0) {
	            $result = pg_fetch_all($result);
	            
	            $vagas = "";
	            foreach ($result as $r){
	                $vagas .= ', ' . $r['vagaid'];
	            }
	            $vagas = substr($vagas, 1);
	            
	            //2. Desativar os candidatos vinculados ou em vinculação
	            $sql = "UPDATE candidatovaga SET ativo = false WHERE vagaid IN ($vagas)";
	            TSqlSelect::customSelect($sql);
	            
	            //3. Desativar as vagas
	            $sql = "UPDATE vaga SET ativa = false WHERE vagaid IN ($vagas)";
	            TSqlSelect::customSelect($sql);
	        }
	        
	        if ($abrirTransacao) {
	            pg_query(conexao::Conectar(), "commit");
	        }
	    }
	    catch (exception $e){
	        if ($abrirTransacao){
	            pg_query(conexao::Conectar(), "rollback");
	        }
	        throw new Exception ($e->getMessage());
	    }
	}
	
	public function desativarGrupo( $array, $verificarVagas = TRUE )
	{
	    if (!is_array($array)) {
	            return FALSE;
	    }
	    try {
	        pg_query(conexao::Conectar(), "begin");
	            
	        foreach ($array as $a){
	            $contrato = new Contrato($a);
	            $contrato->desativar(TRUE, TRUE, FALSE);
	        }
	        
	        pg_query(conexao::Conectar(), "commit");
	    }
	    catch ( exception $e ){
	        pg_query(conexao::Conectar(), "rollback");
	        throw new Exception ( $e->getMessage() );
	    }
	}
	
	public function getContratoOriginal(){
	    return new Contrato($this->contratooriginalid);
	}
	
	public function isAditivo(){
	    $result = FALSE;
	    if ((!is_null($this->contratooriginalid)) and $this->contratooriginalid > 0){
	        $result = TRUE;
	    }
	    return $result;
	}
	
	public function getJustificativasAditivo()
	{
	    $view = new ViewJustificativasAditivo();
	    
	    $criterio = array();
	    $criterio['campo'] = 'contratoid';
	    $criterio['operador'] = '=';
	    $criterio['valor'] = $this->contratoid;
	    
	    $result = $view->listar( $criterio );
	    
	    $array = array();
	    
	    if ( pg_num_rows($result) > 0 ){
	        return pg_fetch_all( $result );
	    }
	    
	}
	
	/**
	 * Verifica se o contrato é um aditivo e caso seja
	 * retorna verdadeiro se o aditivo possui motivo quantidade
	 * @param $contrato
	 * @return bool
	 */
	public function isAditivoJustificativaQuantidade()
	{
        $motivo = MotivoAditivo::MOTIVO_QUANTIDADE;
        if ($this->isAditivo()){
            $justificativaAditivo = new JustificativaAditivo();
            $criterio['precondicao'] = 'contratoid = '.$this->contratoid . ' AND motivoaditivoid = ' . $motivo;
            $result = $justificativaAditivo->listar($criterio);
            if (pg_numrows($result) > 0 ){
                return TRUE;
            }
        }
       
        return FALSE;
	}
	
	/**
	 * Retorna o valor mensal do contrato em reais
	 * @return string
	 */
	public function getValorMensal()
	{
	    return  TUTils::NumToMoney($this->valormensal,TRUE);
	}
	
	/**
	 * Retorna o valor global do contrato em reais
	 * @return string
	 */
	public function getValorGlobal()
	{
	    return  TUTils::NumToMoney($this->valorglobal,TRUE);
	}
	
	public function podeMovimentarCandidatos()
	{
	    if ($this->statusid != Status::Contrato_CadastroConfirmado) {
	        return FALSE;
	    }
	    return TRUE;
	}
	
	/*
	 * Dentro de uma cadeia de contrato-aditivo-aditivo-aditivo,
	 * um número de aditivo tem que ser único.
	 * Retorna: booleano. FALSE para um número repetido.
	 */
	public function verificarUnicidadeNumeroAditivo()
	{
	    if ($this->isAditivo()) {
	        
	        $c = 0;
            $numerosAditivo[$c] = $this->numeroaditivo;
	        
            $contrato = new Contrato($this->contratooriginalid);
            
            while ($contrato->numeroaditivo != NULL) {
	            $c++;
	            $numerosAditivo[$c] = $contrato->numeroaditivo;
	            
	            $contrato = new Contrato($contrato->contratooriginalid);
	        }
	        
	        foreach ($numerosAditivo as $n) {
	            $numero = array_pop($numerosAditivo);
	            if (in_array($numero, $numerosAditivo)) {
	                return FALSE;
	            }
	        }
	        
	    }
	    else {
	        return TRUE;
	    }
	    
	    return TRUE;
	}
	
	/**
	 * Verifica se uma determinada lotação está no contrato
	 * @param $lotacaoid
	 * @return boolean
	 */
	public function hasLotacao($lotacaoid)
	{
	    $result = $this->getLotacoes();
	    $lotacoes = pg_fetch_all($result);
	    if (!$lotacoes) {
	        return FALSE;
	    } 
	    
	    foreach ($lotacoes as $lotacao) {
	        if ($lotacao['lotacaoid'] == $lotacaoid) {
	            return TRUE;
	        }
	    }

	    return FALSE;
	}
	
	public function emRescisao() {
	    if ($this->statusid == Status::Contrato_RescisaoSolicitada OR
	        $this->statusid == Status::Contrato_RescisaoEncaminhada OR
	        $this->statusid == Status::Contrato_RescisaoConfirmada) {
	        return TRUE;
	    }
	    return FALSE;
	}
}

?>